/* Copyright (C) 2004 The Trustees of Indiana University. All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * 1) All redistributions of source code must retain the above copyright notice,
 * the list of authors in the original source code, this list of conditions and
 * the disclaimer listed in this license;
 * 
 * 2) All redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the disclaimer listed in this license in
 * the documentation and/or other materials provided with the distribution;
 * 
 * 3) Any documentation included with all redistributions must include the
 * following acknowledgement:
 * 
 * "This product includes software developed by the Indiana University Extreme!
 * Lab. For further information please visit http://www.extreme.indiana.edu/"
 * 
 * Alternatively, this acknowledgment may appear in the software itself, and
 * wherever such third-party acknowledgments normally appear.
 * 
 * 4) The name "Indiana University" or "Indiana University Extreme! Lab" shall
 * not be used to endorse or promote products derived from this software without
 * prior written permission from Indiana University. For written permission,
 * please contact http://www.extreme.indiana.edu/.
 * 
 * 5) Products derived from this software may not use "Indiana University" name
 * nor may "Indiana University" appear in their name, without prior written
 * permission of the Indiana University.
 * 
 * Indiana University provides no reassurances that the source code provided
 * does not infringe the patent or any other intellectual property rights of any
 * other entity. Indiana University disclaims any liability to any recipient for
 * claims brought by any other entity based on infringement of intellectual
 * property rights or otherwise.
 * 
 * LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH NO
 * WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA UNIVERSITY GIVES
 * NO WARRANTIES AND MAKES NO REPRESENTATION THAT SOFTWARE IS FREE OF
 * INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR OTHER PROPRIETARY RIGHTS.
 * INDIANA UNIVERSITY MAKES NO WARRANTIES THAT SOFTWARE IS FREE FROM "BUGS",
 * "VIRUSES", "TROJAN HORSES", "TRAP DOORS", "WORMS", OR OTHER HARMFUL CODE.
 * LICENSEE ASSUMES THE ENTIRE RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR
 * ASSOCIATED MATERIALS, AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION
 * GENERATED USING SOFTWARE.
 */

package edu.indiana.cs.b534.torrent.impl.message;

import edu.indiana.cs.b534.torrent.TDictionary;
import edu.indiana.cs.b534.torrent.TStruct;
import edu.indiana.cs.b534.torrent.struct.TDictionaryImpl;

import java.io.IOException;
import java.io.OutputStream;

/**
 * @author : Eran Chinthaka (echintha@cs.indiana.edu)
 * @Date : Feb 22, 2007
 * <p/>
 * <p/>
 * TDictionaryImpl is too generic for serializing the tracker request as there is a clearly defined
 * sequence that we should adhere to.
 */
public class TrackerRequestDictionaryImpl extends TDictionaryImpl {

    public OutputStream serialize(OutputStream outStream) throws IOException {
        outStream.write('d'); // prefix
        serializeTStruct(TrackerRequestImpl.INFO_HASH_KEY, outStream);
        serializeTStruct(TrackerRequestImpl.PEER_ID_KEY, outStream);
//        serializeTStruct(Constants.IP_KEY, outStream);
        serializeTStruct(TrackerRequestImpl.PORT_KEY, outStream);
        serializeTStruct(TrackerRequestImpl.UPLOADED_KEY, outStream);
        serializeTStruct(TrackerRequestImpl.DOWNLODED_KEY, outStream);
        serializeTStruct(TrackerRequestImpl.LEFT_KEY, outStream);
        serializeTStruct(TrackerRequestImpl.EVENT_KEY, outStream);
        outStream.write('e'); // suffix

        return outStream;
    }

    private void serializeTStruct(TStruct name, OutputStream outputStream) throws IOException {
        name.serialize(outputStream);
        ((TStruct) dictionary.get(name)).serialize(outputStream);
    }

    public static TDictionary<TStruct> newInstance() {
            return new TrackerRequestDictionaryImpl();
        }


}
